#一般需要根据具体的错误类型来捕获异常(直接写except:（不带任何异常类型）会捕获try块中发生的所有异常，但对比Exception无法通过as关键字为异常实例创建别名变量获取异常信息)
# 如果您不使用as关键字，那么捕获到的异常实例不会自动存储到一个变量中，就无法访问异常对象的任何属性，比如错误消息等
#用一个块可以捕获多个不同类型的异常
# 语法格式:
# try:
#     尝试执行的代码（可能出现错误的代码）
# except：
#     针对错误类型，对应的代码处理（出错之后执行的代码）
# else：
#     没有出现异常时才会执行的代码（try中没有出错才会执行的代码）
# finally：
#     无论是否有异常，都会执行的代码
# 捕获指定的异常
try:
    # 尝试执行的代码
    # print(b)#捕获逻辑的代码
    # li=[1,2,24]
    # print(li[10])
    a=10/0
    pass
except NameError as msg:
    # 针对错误类型NameError，对应的代码处理
    # 捕获到的错误才会在这里执行
    print(msg)# 打印错误信息
    pass
except IndexError as msg:
    print(msg)
    pass
except ZeroDivisionError as msg:
    print(msg)
    pass
print('初次接触异常处理')
print('哈哈')
# 捕获多个异常
try:
    print(name)
except (NameError,ZeroDivisionError) as e:
    print('出现了变量未定义或者除以0的异常错误')
except Exception as result:  # Exception可以捕获所有的异常，当对出现的问题或者错误不确定的情况下，可以使用Exception，这种方式可以获取异常类型
    print(result)
    pass
# 异常的传递
def A(s):
    return 10/int(s)
    pass
def B(s):
    return A(s)*2
def main():
    try:
        B('0')
        pass
    except Exception as msg:
        print(msg)
        pass
    pass
main()# 调用main函数，main函数调用B函数，B函数又调用A函数#异常抛出与之相反
# 不需要在每个可能出错的地方去捕获，在主函数中调用的其他函数，只要出现异常，都会传递到主函数的异常捕获，所以在主函数增加异常捕获就可以了，减少写try...except的麻烦
# 异常的抛出机制：
# 如果在运行时发生异常，解释器会查找相应的异常并进行捕获
# 如果在当前函数里面没有找到的话，它会将异常传递给上层的调用函数
# 如果传递到最外层主程序，仍然没有异常处理，程序才会被终止
# try-except-else
try:
    print('我是没有错误的')
    pass
except Exception as msg:
    print(msg)
else:
    print('当try中的代码没有出现异常的情况下才会执行')
    pass
# try-except-finally
try:
    int('fffffff')
    pass
except Exception as msg:
    print(msg)
    pass
finally:
    print('释放文件的资源、数据库连接的资源等等')
    print('无论是否有异常，都会执行的代码')